Ellipsize the menu items label if they grow too much. (#357303)
authorEmmanuele Bassi <ebassi@gnome.org>
Mon, 15 Jan 2007 12:44:28 +0000 (12:44 +0000)
committerEmmanuele Bassi <ebassi@src.gnome.org>
Mon, 15 Jan 2007 12:44:28 +0000 (12:44 +0000)
2007-01-15  Emmanuele Bassi  <ebassi@gnome.org>

* gtk/gtkrecentchoosermenu.c: Ellipsize the menu items label
if they grow too much. (#357303)

svn path=/trunk/; revision=17156

ChangeLog
gtk/gtkrecentchoosermenu.c

index 54261d3f8d1241476936701c47b1b8047eed887d..0b2606b06366b4151c25c6ce01c8eb80c60756c1 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2007-01-15  Emmanuele Bassi  <ebassi@gnome.org>
+
+       * gtk/gtkrecentchoosermenu.c: Ellipsize the menu items label
+       if they grow too much. (#357303)
+
 2007-01-14  Matthias Clasen  <mclasen@redhat.com>
 
        * gtk/gtkicontheme.c (theme_lookup_icon): When finding a matching
index beea350dcf159175cb9b8d51180131786ec5340e..f3557e45dd067fd93210f28ad2194a6fde4ef96a 100644 (file)
@@ -42,6 +42,7 @@
 #include "gtkseparatormenuitem.h"
 #include "gtkmenu.h"
 #include "gtkimage.h"
+#include "gtklabel.h"
 #include "gtkobject.h"
 #include "gtktooltips.h"
 #include "gtktypebuiltins.h"
@@ -55,6 +56,9 @@ struct _GtkRecentChooserMenuPrivate
   /* size of the icons of the menu items */  
   gint icon_size;
 
+  /* max size of the menu item label */
+  gint label_width;
+
   /* RecentChooser properties */
   gint limit;  
   guint show_private : 1;
@@ -90,6 +94,7 @@ enum {
 
 #define FALLBACK_ICON_SIZE     32
 #define FALLBACK_ITEM_LIMIT    10
+#define DEFAULT_LABEL_WIDTH     30
 
 #define GTK_RECENT_CHOOSER_MENU_GET_PRIVATE(obj)       (G_TYPE_INSTANCE_GET_PRIVATE ((obj), GTK_TYPE_RECENT_CHOOSER_MENU, GtkRecentChooserMenuPrivate))
 
@@ -230,6 +235,8 @@ gtk_recent_chooser_menu_init (GtkRecentChooserMenu *menu)
   
   priv->icon_size = FALLBACK_ICON_SIZE;
   
+  priv->label_width = DEFAULT_LABEL_WIDTH;
+  
   priv->current_filter = NULL;
     
   priv->tooltips = gtk_tooltips_new ();
@@ -892,8 +899,8 @@ gtk_recent_chooser_menu_create_item (GtkRecentChooserMenu *menu,
                                     gint                  count)
 {
   GtkRecentChooserMenuPrivate *priv;
-  gchar *label;
-  GtkWidget *item, *image;
+  gchar *text;
+  GtkWidget *item, *image, *label;
   GdkPixbuf *icon;
 
   g_assert (info != NULL);
@@ -912,19 +919,31 @@ gtk_recent_chooser_menu_create_item (GtkRecentChooserMenu *menu,
       
       /* avoid clashing mnemonics */
       if (count <= 10)
-        label = g_strdup_printf ("_%d. %s", count, escaped);
+        text = g_strdup_printf ("_%d. %s", count, escaped);
       else
-        label = g_strdup_printf ("%d. %s", count, escaped);
+        text = g_strdup_printf ("%d. %s", count, escaped);
       
-      item = gtk_image_menu_item_new_with_mnemonic (label);
+      item = gtk_image_menu_item_new_with_mnemonic (text);
       
       g_free (escaped);
       g_free (name);
     }
   else
     {
-      label = g_strdup (gtk_recent_info_get_display_name (info));
-      item = gtk_image_menu_item_new_with_label (label);
+      text = g_strdup (gtk_recent_info_get_display_name (info));
+      item = gtk_image_menu_item_new_with_label (text);
+    }
+
+  g_free (text);
+
+  /* ellipsize the menu item label, in case the recent document
+   * display name is huge.
+   */
+  label = GTK_BIN (item)->child;
+  if (label)
+    {
+      gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_END);
+      gtk_label_set_max_width_chars (GTK_LABEL (label), priv->label_width);
     }
   
   if (priv->show_icons)
@@ -940,8 +959,6 @@ gtk_recent_chooser_menu_create_item (GtkRecentChooserMenu *menu,
                    G_CALLBACK (item_activate_cb),
                    menu);
 
-  g_free (label);
-
   return item;
 }